﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Media;
using System.Collections.ObjectModel;
using System.Data;
using System.Windows.Media.Imaging;
using System.ComponentModel;
using System.Diagnostics;
using System.Windows.Controls;
using System.Globalization;
using produccion.modelo;
using produccion.AccesoDatos;
using produccion.clases;
using produccion.modulos;
using System.Windows.Input;
using System.Collections.Specialized;

namespace produccion.vistamodelo
{
    class VMResumendeReparaciones : ViewModelBase
    {
        #region Campos
        private MDOgeneral _mod = new MDOgeneral();
        private ProcesoProduccionRepositorio _repositorio = new ProcesoProduccionRepositorio();
        private CLSMAECLIP _cliente = new CLSMAECLIP();
        private MRecibirdePlanta _rec = new MRecibirdePlanta();
        #endregion

        #region Constructor
        public VMResumendeReparaciones()
        {
            try
            {
                lisclientes = _cliente.listaClienteReparaciones();

                if (MDOgeneral.conexion == null || MDOgeneral.conexion.State == ConnectionState.Closed)
                {
                    MDOgeneral.conectar();
                }
                strTituloVentana = "Resumen de Reparaciones - Usuario: " + MDOgeneral.usuario + " - [FRMResumendeReparaciones]";
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
        #endregion

        #region Comandos

        RelayCommand _cmdSalir;
        public ICommand cmdSalir
        {
            get
            {
                if (_cmdSalir == null)
                {
                    _cmdSalir = new RelayCommand(Salir);
                }
                return _cmdSalir;
            }
        }

        RelayCommand _cmdFiltrar;
        public ICommand cmdFiltrar
        {
            get
            {
                if (_cmdFiltrar == null)
                {
                    _cmdFiltrar = new RelayCommand(r => filtrar());
                }
                return _cmdFiltrar;
            }
        }

        RelayCommand _cmdLimpiar;
        public ICommand cmdLimpiar
        {
            get
            {
                if (_cmdLimpiar == null)
                {
                    _cmdLimpiar = new RelayCommand(r => limpiar());
                }
                return _cmdLimpiar;
            }
        }

        RelayCommand _cmdImprimir;
        public ICommand cmdImprimir
        {
            get
            {
                if (_cmdImprimir == null)
                {
                    _cmdImprimir = new RelayCommand(r => Imprimir());
                }
                return _cmdImprimir;
            }
        }

        #endregion

        #region Propiedades

        private string _strTituloVentana;
        public string strTituloVentana
        {
            get { return _strTituloVentana; }
            set { _strTituloVentana = value; base.OnPropertyChanged("strTituloVentana"); }
        }

        private List<CLSMAECLIP> _lisclientes = new List<CLSMAECLIP>();
        public List<CLSMAECLIP> lisclientes
        {
            get { return _lisclientes; }
            set { _lisclientes = value; base.OnPropertyChanged("lisclientes"); }
        }

        private CLSMAECLIP _selcliente = new CLSMAECLIP();
        public CLSMAECLIP selcliente
        {
            get { return _selcliente; }
            set { _selcliente = value; base.OnPropertyChanged("selcliente"); }
        }

        private DateTime _dtmFechaInicial = Convert.ToDateTime("01/01/" + DateTime.Now.Year.ToString()).Date;
        public DateTime dtmFechaInicial
        {
            get { return _dtmFechaInicial; }
            set { _dtmFechaInicial = value; base.OnPropertyChanged("dtmFechaInicial"); }
        }

        private DateTime _dtmFechaFinal = DateTime.Now.Date;
        public DateTime dtmFechaFinal
        {
            get { return _dtmFechaFinal; }
            set { _dtmFechaFinal = value; base.OnPropertyChanged("dtmFechaFinal"); }
        }

        private ObservableCollection<VMListaReparacion> _lisreparaciones = new ObservableCollection<VMListaReparacion>();
        public ObservableCollection<VMListaReparacion> lisreparaciones
        {
            get { return _lisreparaciones; }
            set { _lisreparaciones = value; base.OnPropertyChanged("lisreparaciones"); }
        }

        private VMListaReparacion _selreparacion;
        public VMListaReparacion selreparacion
        {
            get { return _selreparacion; }
            set 
            { 
                _selreparacion = value; 
                base.OnPropertyChanged("selreparacion");
                if (selreparacion != null)
                {
                    visorFotoReferencia.strCodigo = selreparacion.strReferencia;
                    visorFotoReferencia.strColor = selreparacion.strColor;
                }
            }
        }

        private VMvisorFotoReferencia _visorFotoReferencia = new VMvisorFotoReferencia();
        public VMvisorFotoReferencia visorFotoReferencia
        {
            get { return _visorFotoReferencia; }
            set { _visorFotoReferencia = value; base.OnPropertyChanged("visorFotoReferencia"); }
        }

        private Boolean _logGarantia;
        public Boolean logGarantia
        {
            get { return _logGarantia; }
            set { _logGarantia = value; base.OnPropertyChanged("logGarantia"); }
        }

        private Boolean _logServicio;
        public Boolean logServicio
        {
            get { return _logServicio; }
            set { _logServicio = value; base.OnPropertyChanged("logServicio"); }
        }

        private Boolean _logReconocido;
        public Boolean logReconocido
        {
            get { return _logReconocido; }
            set { _logReconocido = value; base.OnPropertyChanged("logReconocido"); }
        }

        private Boolean _logReparacion;
        public Boolean logReparacion
        {
            get { return _logReparacion; }
            set { _logReparacion = value; base.OnPropertyChanged("logReparacion"); }
        }

        private Boolean _logDevolucion;
        public Boolean logDevolucion
        {
            get { return _logDevolucion; }
            set { _logDevolucion = value; base.OnPropertyChanged("logDevolucion"); }
        }

        private Boolean _logRecibido;
        public Boolean logRecibido
        {
            get { return _logRecibido; }
            set { _logRecibido = value; base.OnPropertyChanged("logRecibido"); }
        }

        private Boolean _logPendiente;
        public Boolean logPendiente
        {
            get { return _logPendiente; }
            set { _logPendiente = value; base.OnPropertyChanged("logPendiente"); }
        }

        private Boolean _logEntregado;
        public Boolean logEntregado
        {
            get { return _logEntregado; }
            set { _logEntregado = value; base.OnPropertyChanged("logEntregado"); }
        }
        #endregion

        void filtrar()
        {
            try
            {
                Mouse.OverrideCursor = Cursors.Wait;
                string strCli = "";
                string strTipos ="";
                string strEstados="";

                strCli = selcliente.CODCLI_CLI != null ? selcliente.CODCLI_CLI : "   ";

                if (logGarantia==true)
                    strTipos = strTipos + "G-";
                if (logServicio==true)
                    strTipos = strTipos + "S-";
                if (logReconocido==true)
                    strTipos = strTipos + "C-";
                if (logReparacion==true)
                    strTipos = strTipos + "R-";
                if (logDevolucion==true)
                    strTipos = strTipos + "D-";

                if (logRecibido==true)
                    strEstados = strEstados + "R-";
                if (logPendiente==true)
                    strEstados = strEstados + "P-";
                if (logEntregado==true)
                    strEstados = strEstados + "E-O-";

                List<MRecibirdePlanta> listado = _rec.consultaResumendeReparaciones(strCli, dtmFechaInicial, dtmFechaFinal, strTipos, strEstados);

                int numTotal = 0;
                List<VMListaReparacion> all = (from lis in listado select new VMListaReparacion(lis)).ToList();
                foreach (VMListaReparacion xx in all)
                {
                    xx.logSeleccionado = false;
                    numTotal = numTotal + 1;
                }
                lisreparaciones.Clear();
                lisreparaciones = new ObservableCollection<VMListaReparacion>(all);

                if (numTotal == 1)
                {
                    lisreparaciones[0].logSeleccionado = true;

                    visorFotoReferencia.strCodigo = lisreparaciones[0].strReferencia;
                    visorFotoReferencia.strColor = lisreparaciones[0].strColor;
                }

                Mouse.OverrideCursor = Cursors.Arrow;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        void Imprimir()
        {
            try
            {
                string strTipos = "";
                string strEstados = "";
                string strDañosX = "";

                if (logGarantia == true)
                    strTipos = strTipos + "Garantias-";
                if (logServicio == true)
                    strTipos = strTipos + "Servicios-";
                if (logReconocido == true)
                    strTipos = strTipos + "Reconocidos-";
                if (logReparacion == true)
                    strTipos = strTipos + "Reparaciones-";
                if (logDevolucion == true)
                    strTipos = strTipos + "Devoluciones-";

                if (logRecibido == true)
                    strEstados = strEstados + "Recibidas-";
                if (logPendiente == true)
                    strEstados = strEstados + "Pendientes-";
                if (logEntregado == true)
                    strEstados = strEstados + "Entregadas-";

                DataTable dtEncabezado = new DataTable("dtEncabezado");
                DataRow drEncabezado = dtEncabezado.NewRow();

                DataTable dtDetalle = new DataTable("dtDetalle");

                dtDetalle.Columns.Add("strCodigoCliente", System.Type.GetType("System.String"));
                dtDetalle.Columns.Add("strNombreCliente", System.Type.GetType("System.String"));
                dtDetalle.Columns.Add("strNumeroReparacion", System.Type.GetType("System.String"));
                dtDetalle.Columns.Add("strNumeroDocumento", System.Type.GetType("System.String"));
                dtDetalle.Columns.Add("strNumeroOrden", System.Type.GetType("System.String"));
                dtDetalle.Columns.Add("strEstado", System.Type.GetType("System.String"));
                dtDetalle.Columns.Add("strTipo", System.Type.GetType("System.String"));
                dtDetalle.Columns.Add("strReferencia", System.Type.GetType("System.String"));
                dtDetalle.Columns.Add("strNombreReferencia", System.Type.GetType("System.String"));
                dtDetalle.Columns.Add("strColor", System.Type.GetType("System.String"));
                dtDetalle.Columns.Add("strNombreColor", System.Type.GetType("System.String"));
                dtDetalle.Columns.Add("strTalla", System.Type.GetType("System.String"));
                dtDetalle.Columns.Add("strDaños", System.Type.GetType("System.String"));

                
                dtEncabezado.Columns.Add("strTipos", System.Type.GetType("System.String"));
                dtEncabezado.Columns.Add("strEstados", System.Type.GetType("System.String"));
                dtEncabezado.Columns.Add("strCliente", System.Type.GetType("System.String"));
                dtEncabezado.Columns.Add("strDesde", System.Type.GetType("System.String"));
                dtEncabezado.Columns.Add("strHasta", System.Type.GetType("System.String"));
                dtEncabezado.Columns.Add("strEmpresa", System.Type.GetType("System.String"));

                drEncabezado["strTipos"] = strTipos;
                drEncabezado["strEstados"] = strEstados;
                drEncabezado["strCliente"] = selcliente.NOMCLI_CLI != null ? selcliente.NOMCLI_CLI : "   ";
                drEncabezado["strDesde"] = dtmFechaInicial.ToString("dd/MM/yyyy");
                drEncabezado["strHasta"] = dtmFechaFinal.ToString("dd/MM/yyyy");
                drEncabezado["strEmpresa"] = MDOgeneral.strEmpresaImprime;

                dtEncabezado.Rows.Add(drEncabezado);

                foreach (VMListaReparacion xx in lisreparaciones)
                {
                    strDañosX = "";

                    DataRow drDetalle = dtDetalle.NewRow();
                    drDetalle["strCodigoCliente"] = xx.strCodigoCliente;
                    drDetalle["strNombreCliente"] = xx.strNombreCliente;
                    drDetalle["strNumeroReparacion"] = xx.strNumeroReparacion;
                    drDetalle["strNumeroDocumento"] = xx.strNumeroOrden;
                    drDetalle["strNumeroOrden"] = xx.strNumeroReparacion;
                    drDetalle["strEstado"] = xx.strTipo;
                    drDetalle["strTipo"] = xx.strEstado;
                    drDetalle["strReferencia"] = xx.strReferencia;
                    drDetalle["strNombreReferencia"] = xx.strNombreReferencia;
                    drDetalle["strColor"] = xx.strColor;
                    drDetalle["strNombreColor"] = xx.strNombreColor;
                    drDetalle["strTalla"] = xx.strTalla;

                    if (!String.IsNullOrEmpty(xx.strDaño1))
                        strDañosX = strDañosX + xx.strDaño1.Trim() + "-";
                    if (!String.IsNullOrEmpty(xx.strDaño2))
                        strDañosX = strDañosX + xx.strDaño2.Trim() + "-";
                    if (!String.IsNullOrEmpty(xx.strDaño3))
                        strDañosX = strDañosX + xx.strDaño3.Trim() + "-";
                    if (!String.IsNullOrEmpty(xx.strDaño4))
                        strDañosX = strDañosX + xx.strDaño4.Trim() + "-";
                    if (!String.IsNullOrEmpty(xx.strDaño5))
                        strDañosX = strDañosX + xx.strDaño5.Trim() + "-";

                    drDetalle["strDaños"] = strDañosX;
                    

                    dtDetalle.Rows.Add(drDetalle);
                }

                DataSet ds = new DataSet("dsResumenReparaciones");

                ds.Tables.Add(dtEncabezado);
                ds.Tables.Add(dtDetalle);

                produccion.reportes.Vista vista = new produccion.reportes.Vista { ds = ds, reporte = @"reportes\rptResumenReparaciones.rpt" };

                vista.Show();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        void limpiar()
        {
            try
            {
                selcliente = null;
                dtmFechaInicial = Convert.ToDateTime("01/01/" + DateTime.Now.Year.ToString()).Date;
                dtmFechaFinal = DateTime.Now.Date;
                lisreparaciones.Clear();
                logGarantia = false;
                logServicio = false;
                logReconocido = false;
                logReparacion = false;
                logDevolucion = false;
                logRecibido = false;
                logPendiente = false;
                logEntregado = false;
                if (visorFotoReferencia != null)
                {
                    if (visorFotoReferencia.strCodigo != null)
                    {
                        visorFotoReferencia.strCodigo = "";
                        visorFotoReferencia.strColor = "";
                        base.OnPropertyChanged("visorFotoReferencia");
                    }
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        void Salir(Object frmformulario)
        {
            ((Window)frmformulario).Close();
        }
    }

    #region Vista-modelo
    public class VMListaReparacion : ViewModelBase
    {

        #region Campos
        private MRecibirdePlanta _reparacion = new MRecibirdePlanta();
        #endregion

        #region Constructor

        public VMListaReparacion(MRecibirdePlanta reparaciones)
        {
            _reparacion = reparaciones;
        }

        #endregion

        #region Propiedades

        public string strCodigoCliente
        {
            get { return _reparacion.strCodigoCliente; }
            set { _reparacion.strCodigoCliente = value; base.OnPropertyChanged("strCodigoCliente"); }
        }

        public string strNombreCliente
        {
            get { return _reparacion.strNombreCliente; }
            set { _reparacion.strNombreCliente = value; base.OnPropertyChanged("strNombreCliente"); }
        }

        public string strNumeroReparacion
        {
            get { return _reparacion.strNumeroReparacion; }
            set { _reparacion.strNumeroReparacion = value; base.OnPropertyChanged("strNumeroReparacion"); }
        }

        public string strNumeroDocumento
        {
            get { return _reparacion.strNumeroDocumento; }
            set { _reparacion.strNumeroDocumento = value; base.OnPropertyChanged("strNumeroDocumento"); }
        }

        public string strNumeroOrden
        {
            get { return _reparacion.strNumeroOrden; }
            set { _reparacion.strNumeroOrden = value; base.OnPropertyChanged("strNumeroOrden"); }
        }

        public Int32 numConsecutivo
        {
            get { return _reparacion.numConsecutivo; }
            set { _reparacion.numConsecutivo = value; base.OnPropertyChanged("numConsecutivo"); }
        }        

        public string strReferencia
        {
            get { return _reparacion.strReferencia; }
            set { _reparacion.strReferencia = value; base.OnPropertyChanged("strReferencia"); }
        }

        public string strNombreReferencia
        {
            get { return _reparacion.strNombreReferencia; }
            set { _reparacion.strNombreReferencia = value; base.OnPropertyChanged("strNombreReferencia"); }
        }

        public string strColor
        {
            get { return _reparacion.strColor; }
            set { _reparacion.strColor = value; base.OnPropertyChanged("strColor"); }
        }

        public string strNombreColor
        {
            get { return _reparacion.strNombreColor; }
            set { _reparacion.strNombreColor = value; base.OnPropertyChanged("strNombreColor"); }
        }

        public string strTalla
        {
            get { return _reparacion.strTalla; }
            set { _reparacion.strTalla = value; base.OnPropertyChanged("strTalla"); }
        }

        public DateTime dtmFechaRecibido
        {
            get { return _reparacion.dtmFechaRecibido; }
            set { _reparacion.dtmFechaRecibido = value; base.OnPropertyChanged("dtmFechaRecibido"); }
        }

        public string strTipo
        {
            get { return _reparacion.strTipo; }
            set { _reparacion.strTipo = value; base.OnPropertyChanged("strTipo"); }
        }

        public string strDaño1
        {
            get { return _reparacion.strDaño1; }
            set { _reparacion.strDaño1 = value; base.OnPropertyChanged("strDaño1"); }
        }

        public string strDaño2
        {
            get { return _reparacion.strDaño2; }
            set { _reparacion.strDaño2 = value; base.OnPropertyChanged("strDaño2"); }
        }

        public string strDaño3
        {
            get { return _reparacion.strDaño3; }
            set { _reparacion.strDaño3 = value; base.OnPropertyChanged("strDaño3"); }
        }

        public string strDaño4
        {
            get { return _reparacion.strDaño4; }
            set { _reparacion.strDaño4 = value; base.OnPropertyChanged("strDaño4"); }
        }

        public string strDaño5
        {
            get { return _reparacion.strDaño5; }
            set { _reparacion.strDaño5 = value; base.OnPropertyChanged("strDaño5"); }
        }

        public string strProceso1
        {
            get { return _reparacion.strProceso1; }
            set { _reparacion.strProceso1 = value; base.OnPropertyChanged("strProceso1"); }
        }

        public string strProceso2
        {
            get { return _reparacion.strProceso2; }
            set { _reparacion.strProceso2 = value; base.OnPropertyChanged("strProceso2"); }
        }

        public string strProceso3
        {
            get { return _reparacion.strProceso3; }
            set { _reparacion.strProceso3 = value; base.OnPropertyChanged("strProceso3"); }
        }

        public string strProceso4
        {
            get { return _reparacion.strProceso4; }
            set { _reparacion.strProceso4 = value; base.OnPropertyChanged("strProceso4"); }
        }

        public string strProceso5
        {
            get { return _reparacion.strProceso5; }
            set { _reparacion.strProceso5 = value; base.OnPropertyChanged("strProceso5"); }
        }

        public Boolean logSeleccionado
        {
            get { return _reparacion.logSeleccionado; }
            set { _reparacion.logSeleccionado = value; base.OnPropertyChanged("logSeleccionado"); }
        }

        public string strEstado
        {
            get { return _reparacion.strEstado; }
            set { _reparacion.strEstado = value; base.OnPropertyChanged("strEstado"); }
        }

        #endregion

        #region Metodos

        public MRecibirdePlanta getProcesos()
        {
            return _reparacion;
        }

        #endregion

    }
    #endregion
}
